{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "import math, random\n",
    "\n",
    "import gym\n",
    "import numpy as np\n",
    "\n",
    "import torch\n",
    "import torch.nn as nn\n",
    "import torch.optim as optim\n",
    "import torch.autograd as autograd \n",
    "import torch.nn.functional as F"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "from IPython.display import clear_output\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<h3>Use Cuda</h3>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "USE_CUDA = torch.cuda.is_available()\n",
    "Variable = lambda *args, **kwargs: autograd.Variable(*args, **kwargs).cuda() if USE_CUDA else autograd.Variable(*args, **kwargs)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<h2>Replay Buffer</h2>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "from collections import deque\n",
    "\n",
    "class ReplayBuffer(object):\n",
    "    def __init__(self, capacity):\n",
    "        self.buffer = deque(maxlen=capacity)\n",
    "    \n",
    "    def push(self, state, action, reward, next_state, done):\n",
    "        state      = np.expand_dims(state, 0)\n",
    "        next_state = np.expand_dims(next_state, 0)\n",
    "            \n",
    "        self.buffer.append((state, action, reward, next_state, done))\n",
    "    \n",
    "    def sample(self, batch_size):\n",
    "        state, action, reward, next_state, done = zip(*random.sample(self.buffer, batch_size))\n",
    "        return np.concatenate(state), action, reward, np.concatenate(next_state), done\n",
    "    \n",
    "    def __len__(self):\n",
    "        return len(self.buffer)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<h2>Cart Pole Environment</h2>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\u001b[33mWARN: gym.spaces.Box autodetected dtype as <type 'numpy.float32'>. Please provide explicit dtype.\u001b[0m\n"
     ]
    }
   ],
   "source": [
    "env_id = \"CartPole-v0\"\n",
    "env = gym.make(env_id)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<h2>Epsilon greedy exploration</h2>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "epsilon_start = 1.0\n",
    "epsilon_final = 0.01\n",
    "epsilon_decay = 500\n",
    "\n",
    "epsilon_by_frame = lambda frame_idx: epsilon_final + (epsilon_start - epsilon_final) * math.exp(-1. * frame_idx / epsilon_decay)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x7f849edf1e10>]"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f84a8a423d0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot([epsilon_by_frame(i) for i in range(10000)])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<h2>Double Deep Q Network</h2>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [],
   "source": [
    "class DQN(nn.Module):\n",
    "    def __init__(self, num_inputs, num_actions):\n",
    "        super(DQN, self).__init__()\n",
    "        \n",
    "        self.layers = nn.Sequential(\n",
    "            nn.Linear(env.observation_space.shape[0], 128),\n",
    "            nn.ReLU(),\n",
    "            nn.Linear(128, 128),\n",
    "            nn.ReLU(),\n",
    "            nn.Linear(128, env.action_space.n)\n",
    "        )\n",
    "        \n",
    "    def forward(self, x):\n",
    "        return self.layers(x)\n",
    "    \n",
    "    def act(self, state, epsilon):\n",
    "        if random.random() > epsilon:\n",
    "            state   = Variable(torch.FloatTensor(state).unsqueeze(0), volatile=True)\n",
    "            q_value = self.forward(state)\n",
    "            action  = q_value.max(1)[1].data[0]\n",
    "        else:\n",
    "            action = random.randrange(env.action_space.n)\n",
    "        return action"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "current_model = DQN(env.observation_space.shape[0], env.action_space.n)\n",
    "target_model  = DQN(env.observation_space.shape[0], env.action_space.n)\n",
    "\n",
    "if USE_CUDA:\n",
    "    current_model = current_model.cuda()\n",
    "    target_model  = target_model.cuda()\n",
    "    \n",
    "optimizer = optim.Adam(current_model.parameters())\n",
    "\n",
    "replay_buffer = ReplayBuffer(1000)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<h3>Synchronize current policy net and target net</h3>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [],
   "source": [
    "def update_target(current_model, target_model):\n",
    "    target_model.load_state_dict(current_model.state_dict())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [],
   "source": [
    "update_target(current_model, target_model)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<h2>Computing Temporal Difference Loss</h2>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [],
   "source": [
    "def compute_td_loss(batch_size):\n",
    "    state, action, reward, next_state, done = replay_buffer.sample(batch_size)\n",
    "\n",
    "    state      = Variable(torch.FloatTensor(np.float32(state)))\n",
    "    next_state = Variable(torch.FloatTensor(np.float32(next_state)))\n",
    "    action     = Variable(torch.LongTensor(action))\n",
    "    reward     = Variable(torch.FloatTensor(reward))\n",
    "    done       = Variable(torch.FloatTensor(done))\n",
    "\n",
    "    q_values      = current_model(state)\n",
    "    next_q_values = current_model(next_state)\n",
    "    next_q_state_values = target_model(next_state) \n",
    "\n",
    "    q_value       = q_values.gather(1, action.unsqueeze(1)).squeeze(1) \n",
    "    next_q_value = next_q_state_values.gather(1, torch.max(next_q_values, 1)[1].unsqueeze(1)).squeeze(1)\n",
    "    expected_q_value = reward + gamma * next_q_value * (1 - done)\n",
    "    \n",
    "    loss = (q_value - Variable(expected_q_value.data)).pow(2).mean()\n",
    "        \n",
    "    optimizer.zero_grad()\n",
    "    loss.backward()\n",
    "    optimizer.step()\n",
    "    \n",
    "    return loss"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [],
   "source": [
    "def plot(frame_idx, rewards, losses):\n",
    "    clear_output(True)\n",
    "    plt.figure(figsize=(20,5))\n",
    "    plt.subplot(131)\n",
    "    plt.title('frame %s. reward: %s' % (frame_idx, np.mean(rewards[-10:])))\n",
    "    plt.plot(rewards)\n",
    "    plt.subplot(132)\n",
    "    plt.title('loss')\n",
    "    plt.plot(losses)\n",
    "    plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<h2>Training</h2>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\nv6ExzQAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f63415441d0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "num_frames = 10000\n",
    "batch_size = 32\n",
    "gamma      = 0.99\n",
    "\n",
    "losses = []\n",
    "all_rewards = []\n",
    "episode_reward = 0\n",
    "\n",
    "state = env.reset()\n",
    "for frame_idx in range(1, num_frames + 1):\n",
    "    epsilon = epsilon_by_frame(frame_idx)\n",
    "    action = current_model.act(state, epsilon)\n",
    "    \n",
    "    next_state, reward, done, _ = env.step(action)\n",
    "    replay_buffer.push(state, action, reward, next_state, done)\n",
    "    \n",
    "    state = next_state\n",
    "    episode_reward += reward\n",
    "    \n",
    "    if done:\n",
    "        state = env.reset()\n",
    "        all_rewards.append(episode_reward)\n",
    "        episode_reward = 0\n",
    "        \n",
    "    if len(replay_buffer) > batch_size:\n",
    "        loss = compute_td_loss(batch_size)\n",
    "        losses.append(loss.data[0])\n",
    "        \n",
    "    if frame_idx % 200 == 0:\n",
    "        plot(frame_idx, all_rewards, losses)\n",
    "        \n",
    "    if frame_idx % 100 == 0:\n",
    "        update_target(current_model, target_model)\n",
    "        "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<p><hr></p>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<h1>Atari Environment</h1>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [],
   "source": [
    "from common.wrappers import make_atari, wrap_deepmind, wrap_pytorch"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [],
   "source": [
    "env_id = \"PongNoFrameskip-v4\"\n",
    "env    = make_atari(env_id)\n",
    "env    = wrap_deepmind(env)\n",
    "env    = wrap_pytorch(env)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [],
   "source": [
    "class CnnDQN(nn.Module):\n",
    "    def __init__(self, input_shape, num_actions):\n",
    "        super(CnnDQN, self).__init__()\n",
    "        \n",
    "        self.input_shape = input_shape\n",
    "        self.num_actions = num_actions\n",
    "        \n",
    "        self.features = nn.Sequential(\n",
    "            nn.Conv2d(input_shape[0], 32, kernel_size=8, stride=4),\n",
    "            nn.ReLU(),\n",
    "            nn.Conv2d(32, 64, kernel_size=4, stride=2),\n",
    "            nn.ReLU(),\n",
    "            nn.Conv2d(64, 64, kernel_size=3, stride=1),\n",
    "            nn.ReLU()\n",
    "        )\n",
    "        \n",
    "        self.fc = nn.Sequential(\n",
    "            nn.Linear(self.feature_size(), 512),\n",
    "            nn.ReLU(),\n",
    "            nn.Linear(512, self.num_actions)\n",
    "        )\n",
    "        \n",
    "    def forward(self, x):\n",
    "        x = self.features(x)\n",
    "        x = x.view(x.size(0), -1)\n",
    "        x = self.fc(x)\n",
    "        return x\n",
    "    \n",
    "    def feature_size(self):\n",
    "        return self.features(autograd.Variable(torch.zeros(1, *self.input_shape))).view(1, -1).size(1)\n",
    "    \n",
    "    def act(self, state, epsilon):\n",
    "        if random.random() > epsilon:\n",
    "            state   = Variable(torch.FloatTensor(np.float32(state)).unsqueeze(0), volatile=True)\n",
    "            q_value = self.forward(state)\n",
    "            action  = q_value.max(1)[1].data[0]\n",
    "        else:\n",
    "            action = random.randrange(env.action_space.n)\n",
    "        return action"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [],
   "source": [
    "current_model = CnnDQN(env.observation_space.shape, env.action_space.n)\n",
    "target_model  = CnnDQN(env.observation_space.shape, env.action_space.n)\n",
    "\n",
    "if USE_CUDA:\n",
    "    current_model = current_model.cuda()\n",
    "    target_model  = target_model.cuda()\n",
    "    \n",
    "optimizer = optim.Adam(current_model.parameters(), lr=0.0001)\n",
    "\n",
    "replay_initial = 10000\n",
    "replay_buffer = ReplayBuffer(100000)\n",
    "\n",
    "update_target(current_model, target_model)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [],
   "source": [
    "epsilon_start = 1.0\n",
    "epsilon_final = 0.01\n",
    "epsilon_decay = 30000\n",
    "\n",
    "epsilon_by_frame = lambda frame_idx: epsilon_final + (epsilon_start - epsilon_final) * math.exp(-1. * frame_idx / epsilon_decay)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x7f849c056450>]"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\nKOxFRDLg/wF0AksxrTlRXQAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f84a8a42110>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot([epsilon_by_frame(i) for i in range(1000000)])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f83eef73b10>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "num_frames = 1000000\n",
    "batch_size = 32\n",
    "gamma      = 0.99\n",
    "\n",
    "losses = []\n",
    "all_rewards = []\n",
    "episode_reward = 0\n",
    "\n",
    "state = env.reset()\n",
    "for frame_idx in range(1, num_frames + 1):\n",
    "    epsilon = epsilon_by_frame(frame_idx)\n",
    "    action = current_model.act(state, epsilon)\n",
    "    \n",
    "    next_state, reward, done, _ = env.step(action)\n",
    "    replay_buffer.push(state, action, reward, next_state, done)\n",
    "    \n",
    "    state = next_state\n",
    "    episode_reward += reward\n",
    "    \n",
    "    if done:\n",
    "        state = env.reset()\n",
    "        all_rewards.append(episode_reward)\n",
    "        episode_reward = 0\n",
    "        \n",
    "    if len(replay_buffer) > replay_initial:\n",
    "        loss = compute_td_loss(batch_size)\n",
    "        losses.append(loss.data[0])\n",
    "        \n",
    "    if frame_idx % 10000 == 0:\n",
    "        plot(frame_idx, all_rewards, losses)\n",
    "        \n",
    "    if frame_idx % 1000 == 0:\n",
    "        update_target(current_model, target_model)\n",
    "        "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 2",
   "language": "python",
   "name": "python2"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.13"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
